/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package klijent.kontrolerKI;

import domen.Dolazak;
import domen.Trening;
import domen.Vezbac;
import java.sql.Date;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.LinkedList;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTable;
import klijent.Klijent;
import klijent.gui.util.ModelTabeleDolasci;
import klijent.gui.util.ModelTabeleVezbaci;
import server.util.Transfer;

/**
 *
 * @author Ivan Ivic
 */
public class KontrolerKIDolazak {
    private static int signal;

    // -- metoda za inicijalno postavljanje forme
    public static void pripremiFormuEvidencijaDolazaka(JTable jtVezbaci, JTable jtDolasci, JLabel jlDanasnjiDatum, JButton jbUbaciDolazak)
    {
	// -- postavljanje inicijalnih modela tabela -- 
        ModelTabeleVezbaci mtv = new ModelTabeleVezbaci();
        jtVezbaci.setModel(mtv);
        ModelTabeleDolasci mtd = new ModelTabeleDolasci();
        jtDolasci.setModel(mtd);
	// -- kraj postavljanja inicijalnih modela tabela -- 
		
	// -- postavljanje danasnjeg datuma --
        java.util.Date danas = new java.util.Date();
        DateFormat df = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
        String d = df.format(danas);
        String[] dd = d.split(" ");
        dd = dd[0].split("/");
        d = dd[0] + "-" + dd[1] + "-" + dd[2];
        jlDanasnjiDatum.setText(d);
	// -- kraj postavljanja danasnjeg datuma -- 
		
        jbUbaciDolazak.setEnabled(false);  // Dugme UbaciDolazak se moze koristiti samo ako je selektovan vezbac
    }

    // metoda koja vraca selektovanog vezbaca
    public static void vratiSelektovanogVezbaca(JTable jtVezbaci, JLabel jlImePrezimeVezbaca, JLabel jlNazivTreninga, JLabel jlSifraTreninga, JLabel jlVezbacID, JTable jtDolasci, JButton jbUbaciDolazak, JLabel jlBrojDolazaka)
    {
        Integer s = (Integer) jtVezbaci.getValueAt(jtVezbaci.getSelectedRow(), 0);
        int vezbacID = s;

        Vezbac v = new Vezbac();
        v.setVezbacID(vezbacID);
        Klijent.getInstance().posaljiObjekat(v, Transfer.VRATI_VEZBACA);
        v = (Vezbac) Klijent.getInstance().primiObjekat();

        // ako vezbac ima uplacen trening
        if (!v.getTrening().getSifraTreninga().equals("nema"))
        {
            jlImePrezimeVezbaca.setText(v.toString());
            jlNazivTreninga.setText(v.getTrening().toString());
            jlVezbacID.setText(String.valueOf(v.getVezbacID()));
            jlSifraTreninga.setText(v.getTrening().getSifraTreninga());
            jlSifraTreninga.setVisible(false);

            Dolazak d = new Dolazak();
            d.setVezbacID(v.getVezbacID());
            d.setSifraTreninga(v.getTrening().getSifraTreninga());
            Klijent.getInstance().posaljiObjekat(d, Transfer.VRATI_DOLASKE);

            LinkedList<Dolazak> listaDolazaka = (LinkedList<Dolazak>) Klijent.getInstance().primiObjekat();
            ModelTabeleDolasci mtd = new ModelTabeleDolasci(listaDolazaka);
            jtDolasci.setModel(mtd);
            jbUbaciDolazak.setEnabled(true);

            Klijent.getInstance().posaljiObjekat(d, Transfer.VRATI_BROJ_DOLAZAKA);

            Integer bd = (Integer) Klijent.getInstance().primiObjekat();
            int brojDolazaka = bd;
            jlBrojDolazaka.setText(String.valueOf(brojDolazaka));
        }
        else{ // zabrani unosenje dolazaka za vezbaca koji nema uplacen trening
            signal = 10001;
            proveriGreske(signal);
        }
    }

    // metoda koja ubacuje novi dolazak za selektovanog vezbaca i njegov uplaceni trening
    public static void ubaciNoviDolazak(JLabel jlSifraTreninga, JLabel jlVezbacID, JLabel jlDanasnjiDatum, JTable jtDolasci, JLabel jlBrojDolazaka, JLabel jlNazivTreninga)
    {

        String sifraTreninga = jlSifraTreninga.getText().trim();
        int vezbacID = Integer.parseInt(jlVezbacID.getText().trim());
        Date danas = Date.valueOf(jlDanasnjiDatum.getText().trim());
        Dolazak d = new Dolazak();
        d.setSifraTreninga(sifraTreninga);
        d.setVezbacID(vezbacID);
        d.setVremeDolaska(danas);
       
        // preuzimanje treninga; za uporedjivanje broja dolazaka i broja termina na uplacenoj kartici
        Trening t = new Trening();
        t.setSifraTreninga(sifraTreninga);
        Klijent.getInstance().posaljiObjekat(t, Transfer.VRATI_TRENING);
        t = (Trening) Klijent.getInstance().primiObjekat();

        // sacuvaj dolazak
        Klijent.getInstance().posaljiObjekat(d, Transfer.SACUVAJ_DOLAZAK);
        Klijent.getInstance().primiObjekat();

        signal = Klijent.getInstance().getSignal();
        if (proveriGreske(signal)) {
            Klijent.getInstance().posaljiObjekat(d, Transfer.VRATI_DOLASKE);

            LinkedList<Dolazak> listaDolazaka = (LinkedList<Dolazak>) Klijent.getInstance().primiObjekat();
            ModelTabeleDolasci mtd = new ModelTabeleDolasci(listaDolazaka);
            jtDolasci.setModel(mtd);

            // preuzmi broj dolazaka na ovoj kartici
            int brojDolazaka = Integer.parseInt(jlBrojDolazaka.getText().trim()) + 1;
            jlBrojDolazaka.setText(String.valueOf(brojDolazaka));
            //Klijent.getInstance().posaljiObjekat(d, Transfer.VRATI_BROJ_DOLAZAKA);
            //Integer bd = (Integer) Klijent.getInstance().primiObjekat();
            //int brojDolazaka = bd;
            //jlBrojDolazaka.setText(String.valueOf(brojDolazaka));
            int brojTerminaNaKartici = t.getBrojTermina();

            // istekla kartica
            if (brojDolazaka == (brojTerminaNaKartici)) {
                t = new Trening();
                t.setSifraTreninga("nema");
                t.setNazivTreninga("Nije uplacen trening");
                t.setCena(0);
                t.setBrojDanaTrajanja(0);
                t.setVremeMaxDolaska(0);
                t.setBrojTermina(0);

                // proveri postojanje null treninga
                Klijent.getInstance().posaljiObjekat(t, Transfer.KREIRAJ_TRENING);
                Klijent.getInstance().primiObjekat();

                // vrati vezbaca
                Vezbac v = new Vezbac();
                v.setVezbacID(vezbacID);
                Klijent.getInstance().posaljiObjekat(v, Transfer.VRATI_VEZBACA);
                v = (Vezbac) Klijent.getInstance().primiObjekat();

                // postavi null trening za vezbaca
                v.setTrening(t);
                Klijent.getInstance().posaljiObjekat(v, Transfer.SACUVAJ_VEZBACA);
                jlNazivTreninga.setText(t.getNazivTreninga());
                jlBrojDolazaka.setText("0");

                signal = 10000;
                proveriGreske(signal);
            }
        }
        
        /*Trening t = new Trening();
        t.setSifraTreninga(sifraTreninga);
        Klijent.getInstance().posaljiObjekat(t, Transfer.VRATI_TRENING);
        t = (Trening) Klijent.getInstance().primiObjekat();

        int brojDolazaka = Integer.parseInt(jlBrojDolazaka.getText().trim());
        int brojTerminaNaKartici = t.getBrojTermina();

        // ako je brDol < brTermina => sacuvaj dolazak; povecaj brojDolazaka
        if (brojDolazaka < (brojTerminaNaKartici-1))
        {
            Klijent.getInstance().posaljiObjekat(d, Transfer.SACUVAJ_DOLAZAK);

            Klijent.getInstance().primiObjekat();

            signal = Klijent.getInstance().getSignal();
            if (proveriGreske(signal)) {
                Klijent.getInstance().posaljiObjekat(d, Transfer.VRATI_DOLASKE);

                LinkedList<Dolazak> listaDolazaka = (LinkedList<Dolazak>) Klijent.getInstance().primiObjekat();
                ModelTabeleDolasci mtd = new ModelTabeleDolasci(listaDolazaka);
                jtDolasci.setModel(mtd);
                jlBrojDolazaka.setText(String.valueOf(++brojDolazaka));
            }
        }
        // else ponisti karticu
        else if (brojDolazaka == (brojTerminaNaKartici-1))
        {
            t = new Trening();
            t.setSifraTreninga("nema");
            t.setNazivTreninga("Nije uplacen trening");
            t.setCena(0);
            t.setBrojDanaTrajanja(0);
            t.setVremeMaxDolaska(0);
            t.setBrojTermina(0);

            // prover postojanje null treninga
            Klijent.getInstance().posaljiObjekat(t, Transfer.KREIRAJ_TRENING);
            Klijent.getInstance().primiObjekat();

            // vrati vezbaca
            Vezbac v = new Vezbac();
            v.setVezbacID(vezbacID);
            Klijent.getInstance().posaljiObjekat(v, Transfer.VRATI_VEZBACA);
            v = (Vezbac) Klijent.getInstance().primiObjekat();

            // postavi null trening za vezbaca
            v.setTrening(t);
            Klijent.getInstance().posaljiObjekat(v, Transfer.SACUVAJ_VEZBACA);
            jlNazivTreninga.setText(t.getNazivTreninga());
            jlBrojDolazaka.setText("0");

            signal = 10000;
            proveriGreske(signal);
        }
         * 
         */
        
    }

    private static boolean proveriGreske(int signal)
    {
        switch (signal)
        {
            case 9011:
                prikaziPoruku(signal, "Novi dolazak uspesno sacuvan!", "Obavestenje", JOptionPane.INFORMATION_MESSAGE);
                return true;
            case 9012:
                prikaziPoruku(signal, "Dolazak nije mogao biti sacuvan! Verovatno ste pokusali da sacuvate dva dolaska u istom danu za istog vezbaca!", "Serverska greska", JOptionPane.ERROR_MESSAGE);
                return false;
            case 10000:
                prikaziPoruku(signal, "Ovo je poslednji dolazak! Kartica ponistena!", "Obavestenje", JOptionPane.INFORMATION_MESSAGE);
                return true;
            case 10001:
                prikaziPoruku(signal, "Selektovani vezbac nema uplaceni trening!", "Obavestenje", JOptionPane.INFORMATION_MESSAGE);
            default:
                return false;
        }
    }

    private static void prikaziPoruku(int signal, String poruka, String naslovPoruke, int vrstaPoruke)
    {
        JOptionPane.showMessageDialog(null, "Signal:" + signal + "\n" + poruka, naslovPoruke, vrstaPoruke);
    }
}
